/**
 * clase que contiene el flujo de mensajeria y clientes
 * Sumset
 * Andres Mauricio Jaramillo Gonzalez
 * 22/01/12
 */
package com.sumset.servidor;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;

/**
 * @author Andres
 * 
 */
public class hiloServidor extends Observable implements Runnable {

	Socket sockC1 = null;
	Socket sockC2 = null;
	DataInputStream entrada = null;
	DataOutputStream salida1 = null;
	DataOutputStream salida2 = null;
	servidor servidor;
	String nombreUser;
	public static Vector<hiloServidor> clientesActivos = new Vector();

	/**
	 * constructor de la clase
	 * 
	 * @param sockC1
	 * @param sockC2
	 * @param servidor
	 */
	public hiloServidor(Socket sockC1, Socket sockC2, servidor servidor) {
		super();
		this.sockC1 = sockC1;
		this.sockC2 = sockC2;
		this.servidor = servidor;
		nombreUser = "";
		clientesActivos.add(this);
		servidor.mensaje("Cliente en linea" + this);
	}

	public void run() {
		int opcion = 0;
		int numUsers = 0;
		String amigo = "";
		String mensajecli = "";
		servidor.mensaje("Esperando Mensajes");
		try {
			entrada = new DataInputStream(sockC1.getInputStream());
			salida1 = new DataOutputStream(sockC1.getOutputStream());
			salida2 = new DataOutputStream(sockC2.getOutputStream());
			this.setNombreUser(entrada.readUTF());
			enviarActivosUsuarios();
		} catch (IOException e) {
			e.printStackTrace();
		}
		while (true) {
			try {
				opcion = entrada.readInt();
				System.out.println("la opcion es:"+opcion);
				switch (opcion) {
				case 1: // envia de mensage a todos
					mensajecli = entrada.readUTF();
					servidor.mensaje("mensaje recibido " + mensajecli);
					enviarMsg(mensajecli);
					notify();
					break;
				case 2:// envio de lista de activos
					numUsers = clientesActivos.size();
					salida1.writeInt(numUsers);
					for (int i = 0; i < numUsers; i++)
						salida1.writeUTF(clientesActivos.get(i).getNombreUser());
					break;
				case 3: // envia mensage a uno solo
					amigo = entrada.readUTF();// captura nombre de amigo
					mensajecli = entrada.readUTF();// mensage enviado
					enviaMsg(amigo, mensajecli);
					break;
				}
			} catch (IOException e) {
				System.out.println("Conexion terminada");
				break;
			}
		}
		servidor.mensaje("Se removio un usuario");
		clientesActivos.removeElement(this);
		try {
			servidor.mensaje("Se desconecto un usuario");
			sockC1.close();
		} catch (Exception et) {
			servidor.mensaje("no se puede cerrar el socket");
		}

	}

	/**
	 * metodo para enviar los usuarios que estan acticos en el servidor
	 */
	public void enviarActivosUsuarios() {
		hiloServidor user = null;
		for (int i = 0; i < clientesActivos.size(); i++) {
			try {
				user = clientesActivos.get(i);
				if (user == this) {
					continue;
				}
				user.salida2.writeInt(2);
				user.salida2.writeUTF(this.getNombreUser());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * metodo para enviar los mensajes
	 * 
	 * @param mensajecli2
	 */
	public void enviarMsg(String mensajecli2) {
		hiloServidor user = null;
		for (int i = 0; i < clientesActivos.size(); i++) {
			servidor.mensaje("MENSAJE DEVUELTO:" + mensajecli2);
			try {
				user = clientesActivos.get(i);
				user.salida2.writeInt(1);// opcion de mensage
				user.salida2.writeUTF("" + this.getNombreUser() + " >"
						+ mensajecli2);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * metodo para enviar los mensajes
	 * 
	 * @param amigo
	 * @param mensajecli
	 */
	private void enviaMsg(String amigo, String mensajecli) {
		hiloServidor user = null;
		for (int i = 0; i < clientesActivos.size(); i++) {
			try {
				user = clientesActivos.get(i);
				if (user.nombreUser.equals(amigo)) {
					user.salida2.writeInt(3);// opcion de mensage amigo
					user.salida2.writeUTF(this.getNombreUser());
					user.salida2.writeUTF("" + this.getNombreUser() + ">"
							+ mensajecli);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * metodo que retorna el nombre del usuario
	 * 
	 * @return nombre del usuario
	 */
	public String getNombreUser() {
		return nombreUser;
	}

	/**
	 * metodo que le pone el nombre al usuario
	 * 
	 * @param nombreUser
	 */
	public void setNombreUser(String nombreUser) {
		this.nombreUser = nombreUser;
	}



}
